--
-- Nuevas funciones para integración con Tienda Nube
--

DROP SCHEMA IF EXISTS TIENDANUBE CASCADE;

CREATE SCHEMA tiendanube
    AUTHORIZATION abacouser;

--
--
--

CREATE OR REPLACE FUNCTION tiendanube.get_cadenavacia(
	pdummy character varying,
	pdummy2 character varying)
    RETURNS TABLE(xml character varying) 
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
    ROWS 100

AS $BODY$
DECLARE
BEGIN
  RETURN QUERY EXECUTE ('SELECT CAST(''FIN'' AS VARCHAR(64000)) as xml');
END;
$BODY$;

ALTER FUNCTION tiendanube.get_cadenavacia(character varying, character varying)
    OWNER TO abacouser;
	
--
--
--

CREATE OR REPLACE FUNCTION tiendanube.get_jsonactualizacionstock(
	pidcomm integer,
	psigno integer,
	pcodambsuc character varying,
	strxml character varying)
    RETURNS TABLE(xml character varying) 
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
    ROWS 100

AS $BODY$
DECLARE
  id_tienda   varchar;
  cCursor    refCursor;
  vCadena       varchar;
  vCadenaNuevo  varchar;
  vArbolTN 		varchar;
BEGIN
  -- El id de la tienda está definido en la sucursal
  -- la TiendaStock de la sucursal puede redefinir la tienda de la que se saca el stock
  id_tienda := tiendanube.get_idtiendasucursal(pCodAmbSuc);
  id_tienda := coalesce(tiendanube.get_idtiendastocksucursal(pCodAmbSuc), id_tienda);
  vArbolTN  := (SELECT TIPO FROM ARTA WHERE NOMBRE = 'SincTiendaNube');
    
  IF id_tienda IS NOT NULL AND vArbolTN IS NOT NULL THEN 
  	open cCursor for
  		SELECT '{"sku":' || trim(art.cod) || ',"stock":' || 
		trim(cast(artm.cant * artm.signo * psigno as varchar)) || '}'
    	FROM ARTM
    	INNER JOIN ART ON ART.ID = ARTM.IDART
		INNER JOIN ARTC ON ARTC.TIPOARTA = vArbolTN AND ARTC.IDART = ART.ID AND ARTC.CODARTR = 'STN' 
		INNER JOIN COMM ON COMM.ID = ARTM.IDCOMM
    	WHERE ARTM.IDCOMM = pIdComm AND (ARTM.MODIFICASTOCK = 'S' OR COMM.TIPOCOM = 'PTN');
		
		/* Con cancelacion de pendientes automática .. tomes lo que tomes lleva los pendientes a cero.
           hay que bajar el ModificaStock
		trim(cast(
		CASE WHEN COMM_PEDIDO.ID IS NOT NULL 
			 THEN CASE WHEN PEDIDO.CANTPENDIENTE > 0 THEN artm.cant
			           WHEN PEDIDO.CANTPENDIENTE = 0 AND 
			                (SELECT SUM(cant) FROM ARTM WHERE ORIGENIDARTM = PEDIDO.ID) < PEDIDO.CANT 
			           THEN PEDIDO.CANT - (SELECT SUM(CANT) FROM ARTM WHERE ORIGENIDARTM = PEDIDO.ID) * -1
			      END
			 ELSE CASE WHEN ARTM.MODIFICASTOCK = 'S' THEN artm.cant ELSE 0 END	  
		END * artm.signo * psigno as varchar)) 
        */
  		vCadena := '[';
 
  	fetch cCursor into vCadenaNuevo;
  	while found loop
    	vCadena := vCadena || vCadenaNuevo || ',' ;  
     	fetch cCursor into vCadenaNuevo;
  	end loop;
  	close cCursor;
  	if length(vCadena) > 1 then
		vCadena := trim(vCadena,',');
		vCadena := vCadena || ']';
  	end if;
	IF vCadena <> '[' THEN
	   	RETURN QUERY EXECUTE ('SELECT CAST(''' || trim(id_tienda,'0') || '/act_stock/' || vCadena || ''' AS VARCHAR(64000)) as xml');
	  ELSE
		RETURN QUERY EXECUTE ('SELECT CAST('''' AS VARCHAR(64000)) as xml');
	END IF;
  ELSE
	RETURN QUERY EXECUTE ('SELECT CAST('''' AS VARCHAR(64000)) as xml');
  END IF; 
END;
$BODY$;

ALTER FUNCTION tiendanube.get_jsonactualizacionstock(integer, integer, character varying, character varying)
    OWNER TO abacouser;

--
--
--

CREATE OR REPLACE FUNCTION tiendanube.get_idtiendastocksucursal(
	pcodambsuc character varying)
    RETURNS character varying
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
  UltimaOrden varchar;
  id_tienda   varchar;
BEGIN
  -- vale retornar NULL
  
  id_tienda := (SELECT SUBSTRING(notas, position('<TiendaStock>' in notas) + 13,3) 
				FROM ambsuc WHERE Cod = pCodAmbSuc and position('<TiendaStock>' in notas) > 0);
  RETURN id_tienda;
END;
$BODY$;

ALTER FUNCTION tiendanube.get_idtiendastocksucursal(character varying)
    OWNER TO abacouser;

--
--
--

CREATE OR REPLACE FUNCTION tiendanube.get_idtiendasucursal(
	pcodambsuc character varying)
    RETURNS character varying
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
  UltimaOrden varchar;
  id_tienda   varchar;
BEGIN
  id_tienda := (SELECT SUBSTRING(notas, position('<TiendaNube>' in notas) + 12,3) 
				FROM ambsuc WHERE Cod = pCodAmbSuc);
  id_tienda := coalesce(id_tienda,'0');
  RETURN id_tienda;
END;
$BODY$;

ALTER FUNCTION tiendanube.get_idtiendasucursal(character varying)
    OWNER TO abacouser;

--
-- 
-- 

CREATE OR REPLACE FUNCTION tiendanube.get_ultimaordenprocesada(
	pcodambsuc character varying,
	strxml character varying)
    RETURNS TABLE(xml character varying) 
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
    ROWS 100

AS $BODY$
DECLARE
  UltimaOrden varchar;
  id_tienda   integer;
BEGIN
  id_tienda := tiendanube.getIdTiendaSucursal(pCodAmbSuc);
  UltimaOrden := (SELECT SUBSTRING(notas, position('<UltimaOrden>' in notas) + 13,5)
					 FROM ambsuc WHERE Cod = pCodAmbSuc);

  UltimaOrden := COALESCE((SELECT MAX(txtlibre2) FROM COMM WHERE TIPOCOM = 'PTN' 
						   AND tiendanube.getIdTiendaSucursal(comm.codAmbSuc) = id_tienda),
						   COALESCE(UltimaOrden,'0'),'0');
  UltimaOrden := CAST(CAST(UltimaOrden as integer) + 1 AS VARCHAR);

  RETURN QUERY EXECUTE ('SELECT CAST(''' || cast(id_tienda as varchar) || '/orders?q=' || UltimaOrden || ''' AS VARCHAR(64000)) as xml');
END;
$BODY$;

ALTER FUNCTION tiendanube.get_ultimaordenprocesada(character varying, character varying)
    OWNER TO abacouser;

-- 
-- 
-- 

CREATE OR REPLACE FUNCTION tiendanube.procesar_ordenes(
	pcodambsuc character varying,
	parametros character varying)
    RETURNS TABLE(xml character varying) 
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
    ROWS 1000

AS $BODY$
DECLARE
  paquete varchar;
  i_registro integer;
  i_producto integer;
  
  body json;
  orden json;
  producto json;
  productos json;
  
  vemail varchar;
  vIdPad integer;
  vIdOrden varchar;
  vNroOrden varchar;
  vFecha varchar;
  vstatus varchar;
  vestadodelaorden varchar;
  vestadodelpago varchar;
  vestadodelenvio varchar;
  vnombredelcomprador varchar;
  vdnicuit varchar;
  vtelefono varchar;
  vnombreparaelenvio varchar;
  vtelefonoparaelenvio varchar;
  vdireccionparaelenvio varchar;
  vdomicilioparaelenvio varchar;
  vnumeroparaelenvio varchar;
  vciudadparaelenvio varchar;
  vlocalidadparaelenvio varchar;
  vpisoparaelenvio varchar;
  vprovinciaparaelenvio varchar;
  vcodigopostalparaelenvio varchar;
  vmediodeenvioparaelenvio varchar;
  vmediodepagoparaelenvio varchar;
  vnota  varchar;
  vshipping_option  varchar;
  VGatewayDePago    varchar;

  vLeyenda  varchar;

  vIdArt     varchar;
  vCantidad  varchar;
  vPrecio    varchar; 
  vSKU       varchar;
  vCodStkDep varchar;
 
  vIdArtDesconocido integer;
  vIdPadCF          integer;
  pTipoComF         varchar;
 
  vXML  varchar;

BEGIN
--  insert into importacion.impxml VALUES (1,parametros,null, null, now(), null, 'DUMMY');

  pTipoComf := 'PTN';
  vIdPadCF := 1031;
  vIdArtDesconocido := COALESCE((SELECT ID FROM ART WHERE COD = 'ERROR_TN'),-1);
  vCodStkDep := COALESCE((SELECT CODSTKDEP FROM AMBSUC WHERE AMBSUC.COD = pCodAmbSuc),'D0');
  
  parametros := str_sin_acentos(parametros);
  paquete := replace(parametros,'--#','}');
  paquete := replace(paquete,'#--','{');
  paquete := replace(paquete,'@@@',':');

 -- insert into importacion.impxml VALUES (2,paquete,null, null, now(), null, 'DUMMY');

  body := json_extract_path(cast(paquete as json),'body');
  i_registro := 0;
  
  vXML = 'FIN';
  if (json_array_length(body) > 0) then vXML :=  '<Movimientos>';
  end if;
  
  WHILE i_registro <=  json_array_length(body) - 1 LOOP
     orden  := body -> i_registro;
	 vIdOrden := orden ->> 'id';
	 vNroOrden := orden ->> 'number';
	 vemail := orden -> 'customer' ->> 'email';
	 vIdPad := coalesce((SELECT id FROM PAD where (accesosucursales ilike '%' || pCodambsuc || '%' or accesosucursales = '*') and email = vemail limit 1),vIdPadCf);
	 vFecha := substring(orden ->> 'created_at',1,10); -- 2021-12-05
	 vestadodelaorden  := orden ->> 'status';
	 vestadodelpago  := orden ->> 'payment_status'; 
	 vestadodelenvio := orden ->> 'shipping_status';
	 vnombredelcomprador := orden -> 'customer' ->>'name';
	 vdnicuit  := orden -> 'customer' ->> 'identification';
	 vtelefono := orden -> 'customer' ->> 'phone';
	 vnombreparaelenvio    := orden -> 'shipping_address' ->>'name';
	 vtelefonoparaelenvio  := orden -> 'shipping_address' ->>'phone';
	 vdomicilioparaelenvio := orden -> 'shipping_address' ->>'address';
	 vnumeroparaelenvio    := orden -> 'shipping_address' ->>'number';
	 vciudadparaelenvio    := orden -> 'shipping_address' ->>'city';
	 vlocalidadparaelenvio := orden -> 'shipping_address' ->>'locality';
	 vpisoparaelenvio      := orden -> 'shipping_address' ->>'floor';
	 vprovinciaparaelenvio := orden -> 'shipping_address' ->>'province';
	 vcodigopostalparaelenvio := orden -> 'shipping_address' ->>'zipcode';
	 vmediodeenvioparaelenvio := orden ->> 'shipping';
	 vmediodepagoparaelenvio  := orden ->  'payment_details' ->>'method';
	 vnota         := orden ->> 'note';
	 vshipping_option         := orden ->> 'shipping_option';
	 vGatewayDePago           := orden ->> 'gateway';
 
     vLeyenda :=  'Envio: ' || vshipping_option || chr(10) ||
	          'email: ' || str_sin_acentos(vemail) || chr(10) ||
			  'Orden: ' || str_sin_acentos(vestadodelaorden) || chr(10) ||
			  'Pago : ' || str_sin_acentos(vestadodelpago)   || chr(10) ||
			  'Envio: ' || str_sin_acentos(vestadodelenvio)  || chr(10) ||
			  CASE WHEN vIdPad IS NULL THEN
			      'Nombre: ' ||   str_sin_acentos(vnombredelcomprador) || chr(10) ||
			      'DNI/CUIT: ' || str_sin_acentos(vdnicuit) || chr(10) ||
			      'Telefono: ' || vtelefono || chr(10) 
		      ELSE '' END ||
			  'Pagado por: ' || str_sin_acentos(vGatewayDePago) || chr(10) ||
			  'Nombre envio: ' || str_sin_acentos(vnombreparaelenvio) || chr(10) ||
			  'Telefono envio: ' || vtelefonoparaelenvio              || chr(10) ||
       		  'Direccion: ' || str_sin_acentos(vdomicilioparaelenvio) || ' Nro: ' || vnumeroparaelenvio || 
			  'Piso: ' || vpisoparaelenvio || chr(10) ||
			  'Localidad: ' || str_sin_acentos(vlocalidadparaelenvio) || ' Ciudad: ' || str_sin_acentos(vciudadparaelenvio) || chr(10) || 
			  'C.Postal: '  || vcodigopostalparaelenvio || ' Provincia: ' || vprovinciaparaelenvio || chr(10) || 
              'Envio: ' || str_sin_acentos(vmediodeenvioparaelenvio) || 
			  'Medio de pago: ' || str_sin_acentos(vmediodepagoparaelenvio) || chr(10) || 
			  'Nota: ' || str_sin_acentos(vnota);

	
			vXML := vXML || '<Comprobante TipoCom = "' ||  pTipoComF  
                                         || '" Referencia =  "' || CAST(vidpad AS VARCHAR) || '">' || 
						 '<Encabezado>' || 
                         '<IdPad>'   || CAST(vidpad AS VARCHAR) || '</IdPad><Fecha> ' || to_char(cast(vfecha as date), 'DD/MM/YY') || '</Fecha>' ||
                         '<Leyenda>' || vLeyenda || '</Leyenda>' ||
						 '<txtlibre1>' || vIdOrden || '</txtlibre1>' ||
						 '<txtlibre2>' || vNroOrden || '</txtlibre2>' ||
						 '<detalle> Orden: ' || vNroOrden || '</detalle>' ||
						 '<GeneradoPor>ImpTN</GeneradoPor><CodAmbSuc>' || pCodAmbSuc || '</CodAmbSuc>';
			vXML := vXML || '</Encabezado><Renglones>';
			
			i_registro := i_registro + 1;

            productos := orden -> 'products';
			i_producto := 0;
			WHILE i_producto <= json_array_length(productos) - 1 LOOP
				producto := productos -> i_producto;
				vIdArt    := cast(coalesce((SELECT ID FROM ART WHERE COD = producto ->> 'sku'),vIdArtDesconocido) as varchar);
				vCantidad := producto ->> 'quantity';
				vPrecio   := producto ->> 'price';
				vSKU      := producto ->> 'sku';
				vXML := vXML || 
				   CASE WHEN false  THEN '<RenglonArticulo Signo = "Entrada" >' 
                                    ELSE '<RenglonArticulo Signo = "Salida">'
                   END || 
                   '<IdArt> '  || vIDART    || '</IdArt>' ||
                   '<Cant>'    || vCANTIDAD || '</Cant>';
                 vXML := vXML || '<PrecioCIva>'  || vprecio || '</PrecioCIva>';
                 vXML := vXML || '<PrecioLista>' || vprecio || '</PrecioLista>';
                 vXML := vXML || '<Descripgrande>' || coalesce(vSKU,'') || '</Descripgrande>';
                 vXML := vXML || '<CodStkDep>' || vCodStkDep || '</CodStkDep>';
                 vXML := vXML || '</RenglonArticulo>';
				 i_producto := i_producto + 1;
			END LOOP;
            vXML := vXML || '</Renglones>';
			vXML := vXML || '</Comprobante>';
  	  END LOOP;
	  if (vXML <> 'FIN') then
	      vXML := vXML || '</Movimientos>';
	  end if;
	  vXML := public.str_sin_acentos(vXML);
-- insert into importacion.impxml VALUES (3,vxml,null, null, now(), null, 'DUMMY');

RETURN QUERY EXECUTE ('SELECT cast(' || '''' || vXML || '''' || ' as varchar) as XML');

END;
$BODY$;

ALTER FUNCTION tiendanube.procesar_ordenes(character varying, character varying)
    OWNER TO abacouser;



--
--
--

CREATE TABLE IF NOT EXISTS tiendanube.ordenportienda
(
    idtienda integer NOT NULL,
    ultimaorden integer NOT NULL,
    CONSTRAINT ordenportienda_pkey PRIMARY KEY (idtienda)
)
WITH (
    OIDS = TRUE
)
TABLESPACE pg_default;

ALTER TABLE tiendanube.ordenportienda
    OWNER to abacouser;

COMMENT ON TABLE tiendanube.ordenportienda
    IS 'Ultimas ordenes traidas desde las tiendas';

COMMENT ON COLUMN tiendanube.ordenportienda.idtienda
    IS 'Identificador de la tienda';

COMMENT ON COLUMN tiendanube.ordenportienda.ultimaorden
    IS 'ultima orden traída desde la tienda';
    
    
--
SELECT aaVersion('494.00','493.02');
--    
